package pl.uz.zgora.plan;

import java.util.ArrayList;

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class PlanDatabaseHandler extends SQLiteOpenHelper {
	
	private static final int DATABASE_VERSION = 1;
	private static final String DATABASE_NAME = "PlanUz";
	//Informacje dla tabeli "Grupa"
	public static final String TABLE_GRUPA = "Grupa";
	public static final String KEY_GRUPA = "idGrupy";	
	//Informacje dla tabeli "Budynek"
	public static final String TABLE_BUDYNEK = "Budynek";
	public static final String KEY_BUDYNEK = "idBudynku";
	public static final String KEY_WYDZIAL = "wydzial";
	public static final String KEY_ULICA = "ulica";
	public static final String KEY_MIASTO = "miasto";
	public static final String KEY_KOD_POCZTOWY = "kod_pocztowy";
	//Informacje dla tabeli "Sala"
	public static final String TABLE_SALA = "Sala";
	public static final String KEY_SALA = "idSali";
	public static final String KEY_BUILDING = "symbolBudynku";
	public static final String KEY_FK_BUDYNEK = "fkBudynku";
	//Informacje dla tabeli "Przedmiot"
	public static final String TABLE_PRZEDMIOT = "Przedmiot";
	public static final String KEY_PRZEDMIOT = "idPrzedmiotu";
	public static final String KEY_DAY = "dzien";
	public static final String KEY_SUBGROUP = "podgrupa";
	public static final String KEY_TYPE = "rodzajZajec";
	public static final String KEY_START_TIME = "godzinaRozpoczecia";
	public static final String KEY_END_TIME = "godzinaZakonczenia";
	public static final String KEY_NOTES = "uwagi";
	public static final String KEY_FK_SALA = "fkSali";
	public static final String KEY_FK_GRUPA = "fkGrupy";
	public static final String KEY_FK_NAUCZYCIEL = "fkNauczyciela";
	//Informacje dla tabeli "Nauczyciel"
	public static final String TABLE_NAUCZYCIEL = "Nauczyciel";
	public static final String KEY_NAUCZYCIEL = "idNauczyciela";
	// "KalendrarzTyp"
	public static final String TABLE_KALENDARZ_INFO = "KalendarzTyp";
	// "Dzien"
	public static final String TABLE_DZIEN = "Dzien";
	public static final String KEY_DATE = "data";
	public static final String KEY_WEEK = "tydzien";
	public static final String KEY_CAL_ID = "kalendarzId";
	//Pola wspďż˝lne dla tabel
	public static final String KEY_NAME = "nazwa";
	public static final String KEY_ID = "id";
	
	//Create Database SQL
	private static final String CREATE_GRUPA_TABLE = "create table "
					+ TABLE_GRUPA + "( " + KEY_GRUPA
					+ " integer primary key, " + KEY_NAME
					+ " text not null);"; 
					
	public static final String CREATE_BUDYNEK_TABLE = "create table "
					+ TABLE_BUDYNEK + "(" + KEY_BUDYNEK
					+ " text primary key, " + KEY_WYDZIAL
					+ " text not null, " + KEY_ULICA
					+ " text not null, " + KEY_MIASTO
					+ " text not null, " + KEY_KOD_POCZTOWY
					+ " text not null);";
	
	private static final String CREATE_SALA_TABLE = "create table "
					+ TABLE_SALA + "( " + KEY_SALA
					+ " integer primary key, " + KEY_BUILDING 
					+ " text not null, " + KEY_NAME
					+ " text not null);"; 
					
	private static final String NEW_CREATE_SALA_TABLE = "create table "
					+ TABLE_SALA + "( " + KEY_SALA
					+ " integer primary key, " + KEY_FK_BUDYNEK 
					+ " text, " + KEY_NAME
					+ " text not null,"
					+ " foreign key(" + KEY_FK_BUDYNEK + ") references " + TABLE_BUDYNEK + "(" + KEY_BUDYNEK + "));"; 
	
	private static final String CREATE_PRZEDMIOT_TABLE = "create table "
					+ TABLE_PRZEDMIOT + "( " + KEY_PRZEDMIOT
					+ " integer primary key autoincrement, " + KEY_DAY
					+ " text not null, " + KEY_NAME
					+ " test not null, " + KEY_SUBGROUP
					+ " text not null, " + KEY_TYPE
					+ " text not null, " + KEY_START_TIME
					+ " text not null, " + KEY_END_TIME
					+ " text not null, " + KEY_FK_SALA
					+ " integer not null, " + KEY_FK_GRUPA
					+ " integer not null, " + KEY_FK_NAUCZYCIEL
					+ " integer not null, " + KEY_NOTES
					+ " text, foreign key(" + KEY_FK_SALA + ") references " + TABLE_SALA + "(" + KEY_SALA + "),"
					+ " foreign key(" + KEY_FK_GRUPA + ") references " + TABLE_GRUPA + "(" + KEY_GRUPA + "),"
					+ " foreign key(" + KEY_FK_NAUCZYCIEL + ") references " + TABLE_NAUCZYCIEL + "(" + KEY_NAUCZYCIEL + "));";
	
	private static final String CREATE_NAUCZYCIEL_TABLE = "create table "
					+ TABLE_NAUCZYCIEL + "( " + KEY_NAUCZYCIEL
					+ " integer primary key, " + KEY_NAME
					+ " text not null);";
	
	private static final String CREATE_KALENDARZ_INFO_TABLE = "create table "
			+ TABLE_KALENDARZ_INFO + "( " + KEY_ID
			+ " integer primary key, " + KEY_NAME
			+ " text not null);";
	
	private static final String CREATE_DZIEN_TABLE = "create table "
			+ TABLE_DZIEN + "( "  + KEY_DATE
			+ " text not null, " + KEY_WEEK
			+ " text not null, " + KEY_CAL_ID
			+ " text not null);";
	
	
	
	
	private static final String DROP_GRUPA_TABLE = "DROP TABLE IF EXISTS " + TABLE_GRUPA + ";";
	private static final String DROP_SALA_TABLE = "DROP TABLE IF EXISTS " + TABLE_SALA + ";";
	private static final String DROP_NAUCZYCIEL_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAUCZYCIEL + ";";
	private static final String DROP_KALENDARZ_INFO_TABLE = "DROP TABLE IF EXISTS " + TABLE_KALENDARZ_INFO + ";";
	private static final String DROP_DZIEN_TABLE = "DROP TABLE IF EXISTS " + TABLE_DZIEN + ";";
	private static final String DROP_PRZEMIOT_TABLE = "DROP TABLE IF EXISTS " + TABLE_PRZEDMIOT + ";";
	private static final String DROP_BUDYNEK_TABLE = "DROP TABLE IF EXISTS " + TABLE_BUDYNEK + ";";
	
	public PlanDatabaseHandler(Context context, boolean removeDB)
	{
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
		init(context, removeDB);
	}
	
	private void init(Context context, boolean removeDB) {
		SQLiteDatabase db = getWritableDatabase();
		if(removeDB) {
			dropAllTables(db);
			createAllTables(db);
			initBuildingInsert(db);
		}
	}
	
	public PlanDatabaseHandler(Context context)
	{
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
		init(context, false);
	}
	
	private void createAllTables(SQLiteDatabase db) {
		try {
			dropAllTables(db);
			db.execSQL(CREATE_GRUPA_TABLE);
			db.execSQL(CREATE_NAUCZYCIEL_TABLE);
			
			db.execSQL(CREATE_PRZEDMIOT_TABLE);
			db.execSQL(CREATE_SALA_TABLE);
			// NEW db.execSQL(NEW_CREATE_SALA_TABLE);
			db.execSQL(CREATE_BUDYNEK_TABLE);
			db.execSQL(CREATE_DZIEN_TABLE);
			db.execSQL(CREATE_KALENDARZ_INFO_TABLE);
		} catch(SQLException e) {
			e.printStackTrace();
		}
	}
	
	private void dropAllTables(SQLiteDatabase db) {
		db.execSQL(DROP_GRUPA_TABLE);
		db.execSQL(DROP_SALA_TABLE);
		db.execSQL(DROP_KALENDARZ_INFO_TABLE);
		db.execSQL(DROP_DZIEN_TABLE);
		db.execSQL(DROP_NAUCZYCIEL_TABLE);
		db.execSQL(DROP_PRZEMIOT_TABLE);
		db.execSQL(DROP_BUDYNEK_TABLE);
	}
	
	public boolean CheckDatabaseExists()
	{
		SQLiteDatabase checkDB = null;
		
		try {
	        checkDB = SQLiteDatabase.openDatabase(DATABASE_NAME, null, SQLiteDatabase.OPEN_READONLY);
	        checkDB.close();
	    } catch (SQLiteException e) {
	        // database doesn't exist yet.
	    }
	    return checkDB != null ? true : false;
	}
	
	@Override
	public void onCreate(SQLiteDatabase db) {
		dropAllTables(db);
		createAllTables(db);

	}
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		 dropAllTables(db);
		 createAllTables(db);
	}

	private void initBuildingInsert(SQLiteDatabase database)
	{
		final String miasto = "Zielona Góra";
		final String[] kody_pocztowe = {"65-246", "65-516", "65-762", "65-462", "65-001", "65-561", "65-517"};
		ArrayList<Budynek> budynki = new ArrayList<Budynek>();
		// A-0
		budynki.add(new Budynek("A-0", "Wydział Ekonomii i Zarządzania", "ul. Podgórna 50", miasto, kody_pocztowe[0]));
		// A-5
		budynki.add(new Budynek("A-5", "Wydział Ekonomii i Zarządzania", "ul. Podgórna 50d", miasto, kody_pocztowe[0]));
		// A-8
		budynki.add(new Budynek("A-8", "Wydział Inżynierii Lądowej i Środowiska\r\nWydział Nauk Biologicznych", "ul. prof. Z. Szafrana 1", miasto, kody_pocztowe[1]));
		// A-7
		budynki.add(new Budynek("A-7", "Budynek Administracyjny", "ul. prof. Z. Szafrana 21", miasto, kody_pocztowe[1]));
		// A-29
		budynki.add(new Budynek("A-29", "Wydział Matematyki, Informatyki i Ekonometrii\r\nWydział Fizyki i Astronimii ", "ul. prof. Z. Szafrana 4a", miasto, kody_pocztowe[1]));
		// C-2
		budynki.add(new Budynek("C-2", "Dom Studenta \"Piast\"", "ul. Podgórna 50c", miasto, kody_pocztowe[0]));
		// C-10 
		budynki.add(new Budynek("C-10", "Wydział Elektrotechniki, Informatyki i Telekomunikacji", "ul. Ogrodowa 3b", miasto, kody_pocztowe[3]));
		// A-10
		budynki.add(new Budynek("A-10", "Wydział Mechaniczny", "ul. prof. Z. Szafrana 4", miasto, kody_pocztowe[1]));
		// A-12
		budynki.add(new Budynek("A-12", "Wydział Inżynierii Lądowej i Środowiska", "ul. prof. Z. Szafrana 15", miasto, kody_pocztowe[1]));
		// A-11
		budynki.add(new Budynek("A-11", "Wydział Mechaniczny", "ul. prof. Z. Szafrana 4", miasto, kody_pocztowe[1]));
		// A-16
		budynki.add(new Budynek("A-16", "Wydział Humanistyczny\r\nWydział Pedagogiki, Socjologii i Nauk o Zdrowiu", "ul. Wojska Polskiego 69", miasto, kody_pocztowe[2]));
		// A-20
		budynki.add(new Budynek("A-20", "Wydział Humanistyczny", "ul. Wojska Polskiego 71a", miasto, kody_pocztowe[2]));
		// A-17
		budynki.add(new Budynek("A-17", "Budynek Administracyjny", "ul. Wojska Polskiego 69", miasto, kody_pocztowe[2]));
		// A-23
		budynki.add(new Budynek("A-23", "Wydział Humanistyczny", "ul. Wojska Polskiego 71", miasto, kody_pocztowe[2]));
		// A-24
		budynki.add(new Budynek("A-24", "Wydział Artystyczny", "ul. Wiśniowa 10", miasto, kody_pocztowe[6]));
		// A-22
		budynki.add(new Budynek("A-22", "Wydział Artystyczny\r\nWydział Pedagogiki, Socjologii i Nauk o Zdrowiu", "ul. Energetyków 2", miasto, kody_pocztowe[4]));
		// A-15
		budynki.add(new Budynek("A-15", "Studium Nauki Języków Obcych", "ul. prof. Z. Szafrana 19", miasto, kody_pocztowe[1]));
		// A-26
		budynki.add(new Budynek("A-26", "Wydział Inżynierii Lądowej i Środowiska", "ul. Monte-Cassino 21b", miasto, kody_pocztowe[5]));
		
		BudynekDataSource budynekDataSource = new BudynekDataSource(database);
		budynekDataSource.addBudynekList(budynki);
	}
	
}